package Api.OneCodePay;

import Util.HttpUtil;
import Util.MyKey;

import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import static Util.Tools.MaptoStr;
import static Util.Tools.getMD5;

/**
 * 一码付支付Api
 */
public class OnePayApi {
    public static void main(String[] args) {
        try {
            // 目标URL
            String url = "https://pay.heepay.com/Payment/Index.aspx";
            //需要的MD5密钥，商户后台网关密钥下面第一个
            //String key = MyKey.MD5Key;
            String key = MyKey.MD5Key;
            //商户编号，（汇付宝商户内码：七位整数数字）
            String agent_id = "1664502";
            //子商户号
            String ref_agent_id = "";
            // 获取当前14位时间戳
            Date now = new Date();
            // 创建 SimpleDateFormat 对象，指定日期格式
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
            String timestamp = dateFormat.format(now);
            //固定版本号
            String version = "1";
            String pay_type = "0";
            String is_phone = "1";
            String is_frame = "1";
            String agent_bill_id = timestamp;
            String agent_bill_time = timestamp;
            String pay_amt = "0.01";
            /*
            支付后的异步地址，URL参数是以http://或https://开头的完整URL地址(后台处理)，提交的url地址必须外网能访问到，否则无法通知商户。值可以为空，但不可以为null。
             */
            String notify_url = "https://www.baidu.com/";
            String return_url = "https://www.baidu.com/";
            String user_ip = "127_127_12_12";
            String goods_num = "1";
            String goods_name = "商品名称";
            String goods_name1 = URLEncoder.encode(goods_name, "GBK");
            //支付宝需要传个人账户user_id。（不参加签名）
            String remark = "1234";
            String goods_note = "支付说明,比如购买商品";
            String goods_note1 = URLEncoder.encode(goods_note, "GBK");

            String sign_type = "MD5";


            // 请求参数，以Map形式表示
            Map<String, String> parameters = new HashMap<>();
            //拼接待加密参数
            String Date = "version=" +
                    version +
                    "&agent_id=" +
                    agent_id +
                    "&agent_bill_id=" +
                    agent_bill_id +
                    "&agent_bill_time=" +
                    agent_bill_time +
                    "&pay_type=" +
                    pay_type +
                    "&pay_amt=" +
                    pay_amt +
                    "&notify_url=" +
                    notify_url +
                    "&return_url=" +
                    return_url +
                    "&user_ip=" +
                    user_ip +
                    "&key=" +
                    key
//                    + "&ref_agent_id=" +
//                    ref_agent_id
                    ;
            System.out.println("待签名串：" + Date);

            //MD5加密得出签名结果
            String sign = getMD5(Date);

            parameters.put("version", version);
            parameters.put("pay_type", pay_type);
            parameters.put("agent_id", agent_id);
            //parameters.put("ref_agent_id", ref_agent_id);
            parameters.put("agent_bill_id", agent_bill_id);
            parameters.put("agent_bill_time", agent_bill_time);
            parameters.put("pay_amt", pay_amt);
            parameters.put("notify_url", notify_url);
            parameters.put("return_url", return_url);
            parameters.put("user_ip", user_ip);
            parameters.put("goods_name", goods_name1);
            parameters.put("is_frame", is_frame);
            parameters.put("is_phone", is_phone);
            parameters.put("goods_num", goods_num);
            parameters.put("remark", remark);
            parameters.put("goods_note", goods_note1);
            parameters.put("sign_type", sign_type);
            parameters.put("sign", sign);

            //打印请求参数
            String Str = MaptoStr(parameters);
            System.out.println("发送请求数据："+ Str);

            String Response = HttpUtil.sendPost1(url, parameters);
            System.out.println(Response);


        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }
}
